package regexgolf2.ui.subcomponents.challengetitle; import java.util.Optional; import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.scene.text.Font; import org.controlsfx.control.PopOver; import org.controlsfx.control.PopOver.ArrowLocation; import org.controlsfx.dialog.DialogStyle; import org.controlsfx.dialog.Dialogs; import com.google.java.contract.Ensures; import com.google.java.contract.Requires; public class ChallengeTitleUI { private final HBox _root = new HBox(); private final Label _nameLabel = new Label(); private final ImageView _imageView = new ImageView(); private final PopOver _popOver = new PopOver(); private final TextField _textField = new TextField(); private final BooleanProperty _editable = new SimpleBooleanProperty(); private final ObjectProperty<Font> _font = new SimpleObjectProperty<>(); private final StringProperty _text = new SimpleStringProperty(); public ChallengeTitleUI() { setFont(new Font(20)); setEditable(true); initLayout(); initHandlers(); initPopOver(); } private void initLayout() { _nameLabel.fontProperty().bind(_font); _textField.fontProperty().bind(_font); _nameLabel.textProperty().bind(_text); _textField.textProperty().bindBidirectional(_text); _root.spacingProperty().bind(_nameLabel.heightProperty().multiply(0.6)); _root.setAlignment(Pos.CENTER_LEFT); _imageView.visibleProperty().bind(_root.hoverProperty().and(_editable)); // _imageView.fitHeightProperty().bind(_nameLabel.heightProperty().multiply(0.75)); _imageView.setFitHeight(18); //TODO fix Bug with scaling issues on initialization _imageView.setPreserveRatio(true); Image editImage = new Image(this.getClass().getResourceAsStream("/regexgolf2/ui/img/edit.png")); _imageView.setImage(editImage); _root.getChildren().addAll(_nameLabel, _imageView); } private void initHandlers() { _root.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if (isEditable()) { //TODO fix PopOver-Exception // _popOver.show(_nameLabel); //Workaround while PopOver is unusable: Use a Dialog Optional<String> result = Dialogs.create() .title("Enter Challenge Name") .message("Challenge Name: ") .style(DialogStyle.NATIVE) .showTextInput(getText()); if (result.isPresent()) setText(result.get()); } } }); _textField.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent arg0) { _popOver.hide(); } }); } private void initPopOver() { HBox box = new HBox(); box.getChildren().add(_textField); HBox.setMargin(_textField, new Insets(13.0)); _popOver.setContentNode(box); _popOver.setDetachable(false); _popOver.setAutoHide(true); _popOver.setArrowLocation(ArrowLocation.BOTTOM_CENTER); } public String getText() { return _text.get(); } public void setText(String text) { _text.set(text); } public StringProperty textProperty() { return _text; } @Ensures("result != null") public Font getFont() { return _font.get(); } @Requires("font != null") public void setFont(Font font) { _font.set(font); } public ObjectProperty<Font> fontProperty() { return _font; } public boolean isEditable() { return _editable.get(); } public void setEditable(boolean editable) { _editable.set(editable); } public BooleanProperty editableProperty() { return _editable; } public Node getUINode() { return _root; } }